package com.reactor.mono;

import java.util.Date;

import org.junit.Test;

import reactor.core.publisher.Mono;

public class DeferDemo {

	/**
	 * 输出结果
Fri Feb 07 10:22:51 GMT+08:00 2020
Fri Feb 07 10:22:51 GMT+08:00 2020
Fri Feb 07 10:22:51 GMT+08:00 2020
Fri Feb 07 10:22:56 GMT+08:00 2020
我们可以看到，创建了两个数据源，一个使用Mono.just创建，一个用Mono.defer创建，然后分别通过lambda表达式订阅这两个publisher，可以看到两个输出的时间都是10:22：51，延迟5秒钟后重新订阅，Mono.just创建的数据源时间没变，但是Mono.defer创建的数据源时间相应的延迟了5秒钟，原因在于Mono.just会在声明阶段构造Date对象，只创建一次，但是Mono.defer却是在subscribe阶段才会创建对应的Date对象，每次调用subscribe方法都会创建Date对象
	 */
	@Test
	public void defer(){
		//声明阶段创建DeferClass对象

		Mono<Date> m1 = Mono.just(new Date());
		Mono<Date> m2 = Mono.defer(()->Mono.just(new Date()));
		m1.subscribe(System.out::println);
		m2.subscribe(System.out::println);
        //延迟5秒钟
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		m1.subscribe(System.out::println);
		m2.subscribe(System.out::println);
	}

}
